#ifndef THREAD8_H
#define THREAD8_H

#include <stdint.h>
#include <pthread.h>
#include "log_utils.h"

// RS232串口设备定义
#define NAV_RS232_DEVICE "/dev/ttyS8"  // RS232-1，TU-BD100组合导航设备

// 460800波特率定义（如果系统不支持则自定义）
#ifndef B460800
#define B460800 0010004
#endif
#define NAV_RS232_BAUDRATE B460800     // 波特率460800 8-N-1

// TU-BD100配置命令定义
#define TU_BD100_CONFIG_CMD "log com1 inspvaxa ontime 2\r\n"  // 每2秒输出一条INSPVAXA数据，可根据需要修改时间

// ========================================================================
// TU-BD100超时配置定义（基于数据输出间隔的时间配置）
// ========================================================================
// 使用说明：
// 1. 如果要改为1秒输出1次：修改 TU_BD100_DATA_INTERVAL_SEC 为 1，同时修改 TU_BD100_CONFIG_CMD 为 "log com1 inspvaxa ontime 1\r\n"
// 2. 如果要改为10秒输出1次：修改 TU_BD100_DATA_INTERVAL_SEC 为 10，同时修改 TU_BD100_CONFIG_CMD 为 "log com1 inspvaxa ontime 10\r\n"
// 3. 其他超时时间会自动根据数据间隔进行调整
// ========================================================================
#define TU_BD100_DATA_INTERVAL_SEC    2      // 数据输出间隔（秒），与CONFIG_CMD中的时间保持一致
#define TU_BD100_NO_DATA_TIMEOUT_SEC  (TU_BD100_DATA_INTERVAL_SEC * 2 + 1)  // 无数据超时时间（秒），设为数据间隔的2倍+1秒
#define TU_BD100_WARNING_INTERVAL_SEC 30     // 警告输出间隔（秒），避免频繁打印警告
#define TU_BD100_SELECT_TIMEOUT_MS    100    // select超时时间（毫秒）
#define TU_BD100_CONFIG_WAIT_SEC      3      // 配置命令等待时间（秒）
#define TU_BD100_INIT_WAIT_SEC        1      // 初始化等待时间（秒）

// 数据接收完毕检测配置
#define FRAME_COMPLETE_CHECK_COUNT    5      // 检测帧完整性的连续读取次数
#define FRAME_COMPLETE_CHECK_INTERVAL_MS 10  // 每次检测的间隔时间（毫秒）

// 缓冲区大小定义
#define NAV_RX_BUFFER_SIZE 4096        // 增大接收缓冲区大小
#define NAV_FRAME_MAX_SIZE 512         // 增大单帧最大长度

// 帧头定义
#define NAV_FRAME1_HEADER "$GPRMC"     // GPRMC报文帧头
#define NAV_FRAME2_HEADER "$GPGGA"     // GPGGA报文帧头
#define NAV_FRAME3_HEADER "$GPVTG"     // GPVTG报文帧头
#define NAV_FRAME4_HEADER "#INSPVAXA"  // INSPVAXA报文帧头
#define NAV_FRAME5_HEADER "$GPFPD"     // GPFPD报文帧头
#define NAV_IMU_DATA_DELIM ","         // IMU原始数据分隔符

// 帧头长度
#define NAV_FRAME_HEADER_LEN 6         // 标准帧头长度
#define NAV_INSPVAXA_HEADER_LEN 9      // INSPVAXA帧头长度

// INS状态定义
#define INS_STATUS_INACTIVE           "INS_INACTIVE"        // IMU输出，对准未开始
#define INS_STATUS_ALIGNING           "INS_ALIGNING"        // 对准过程中
#define INS_STATUS_HIGH_VARIANCE      "INS_HIGH_VARIANCE"   // 对准完成，航向未收敛
#define INS_STATUS_SOLUTION_GOOD      "INS_SOLUTION_GOOD"   // 收敛完成，工作良好
#define INS_STATUS_SOLUTION_FREE      "INS_SOLUTION_FREE"   // 卫星导航误差大，拒绝参与解算
#define INS_STATUS_ALIGNMENT_COMPLETE "INS_ALIGNMENT_COMPLETE" // 对准完成，精度不够
#define INS_STATUS_DETERMINING_ORIENTATION "DETERMINING_ORIENTATION" // 正在对准收敛
#define INS_STATUS_WAITING_INITIALPOS "WAITING_INITIALPOS"  // 等待初始位置

// POS状态定义
#define POS_STATUS_NONE               "NONE"          // 无状态，不可用
#define POS_STATUS_SINGLE             "Single"        // 单点定位状态
#define POS_STATUS_PSRDIFF            "INS_PSRDIFF"   // 伪距差分状态
#define POS_STATUS_RTKFLOAT           "INS_RTKFLOAT"  // 浮点解状态
#define POS_STATUS_RTKFIXED           "INS_RTKFIXED"  // 固定解状态

// 导航数据结构体 - GPRMC报文 (推荐最小定位信息)
typedef struct {
    // 时间信息
    int hour;                  // 时
    int minute;                // 分
    int second;                // 秒
    float millisecond;         // 毫秒
    
    // 日期信息
    int day;                   // 日
    int month;                 // 月
    int year;                  // 年
    
    // 位置信息
    double latitude;           // 纬度，单位：度
    char ns;                   // 北/南半球指示，N-北半球，S-南半球
    double longitude;          // 经度，单位：度
    char ew;                   // 东/西半球指示，E-东半球，W-西半球
    
    // 运动信息
    float speed;               // 地面速率，单位：节
    float course;              // 地面航向，单位：度
    
    // 状态信息
    char status;               // 定位状态，A-有效定位，V-无效定位
    char mode;                 // 模式指示，A-自主定位，D-差分定位，E-估算
    
    // 时间戳
    uint32_t timestamp;        // 系统时间戳
} nav_rmc_data_t;

// 导航数据结构体 - GPGGA报文 (全球定位系统定位数据)
typedef struct {
    // 时间信息
    int hour;                  // 时
    int minute;                // 分
    int second;                // 秒
    float millisecond;         // 毫秒
    
    // 位置信息
    double latitude;           // 纬度，单位：度
    char ns;                   // 北/南半球指示，N-北半球，S-南半球
    double longitude;          // 经度，单位：度
    char ew;                   // 东/西半球指示，E-东半球，W-西半球
    
    // 定位信息
    int quality;               // 定位质量指示，0-无效，1-单点定位，2-差分定位
    int satellites;            // 卫星数量
    float hdop;                // 水平精度因子
    float altitude;            // 海拔高度，单位：米
    float geoid;               // 大地水准面高度，单位：米
    
    // 时间戳
    uint32_t timestamp;        // 系统时间戳
} nav_gga_data_t;

// 导航数据结构体 - GPVTG报文 (地面速度信息)
typedef struct {
    float true_course;         // 真北航向，单位：度
    float magnetic_course;     // 磁北航向，单位：度
    float speed_knots;         // 地面速率，单位：节
    float speed_kmh;           // 地面速率，单位：公里/小时
    char mode;                 // 模式指示，A-自主定位，D-差分定位，E-估算
    
    // 时间戳
    uint32_t timestamp;        // 系统时间戳
} nav_vtg_data_t;

// 导航数据结构体 - INSPVAXA报文 (组合导航解算数据)
typedef struct {
    // 语句头信息
    char port[16];             // 端口信息 (如: COM1)
    int week_number;           // GPS周数
    double week_seconds;       // GPS周秒
    char solution_type[32];    // 解算类型 (如: FINESTEERING)
    
    // 状态信息
    char ins_status[32];       // INS状态字
    char pos_status[32];       // POS状态字
    
    // 位置信息
    double latitude;           // 纬度，单位：度
    double longitude;          // 经度，单位：度
    double height;             // 高程，单位：米
    double undulation;         // 起伏（椭球分离值），单位：米
    
    // 速度信息
    double north_velocity;     // 北向速度，单位：m/s
    double east_velocity;      // 东向速度，单位：m/s
    double up_velocity;        // 天向速度，单位：m/s
    
    // 姿态信息
    double roll;               // 横滚角，单位：度
    double pitch;              // 俯仰角，单位：度
    double azimuth;            // 航向角，单位：度
    
    // 精度信息
    double lat_std;            // 纬度标准差
    double lon_std;            // 经度标准差
    double height_std;         // 高程标准差
    double north_vel_std;      // 北向速度标准差
    double east_vel_std;       // 东向速度标准差
    double up_vel_std;         // 天向速度标准差
    double roll_std;           // 横滚角标准差
    double pitch_std;          // 俯仰角标准差
    double azimuth_std;        // 航向角标准差
    
    // 其他信息
    int extended_status;       // 扩展状态字
    int update_time;           // 设备静止时间
    
    // 时间戳
    uint32_t timestamp;        // 系统时间戳
} nav_inspvaxa_data_t;

// 导航数据结构体 - GPFPD报文 (惯导数据)
typedef struct {
    int gps_week;              // GPS周
    double gps_seconds;        // GPS周秒
    double heading;            // 偏航角，单位：度
    double pitch;              // 俯仰角，单位：度
    double roll;               // 滚动角，单位：度
    double latitude;           // 纬度，单位：度
    double longitude;          // 经度，单位：度
    double altitude;           // 高度，单位：米
    double east_vel;           // 东速，单位：m/s
    double north_vel;          // 北速，单位：m/s
    double up_vel;             // 天速，单位：m/s
    double baseline;           // 基线长度，单位：米
    int nsv1;                  // 天线1卫星数
    int nsv2;                  // 天线2卫星数
    int satellite_status;      // 卫星状态，0-不可用，1-可用
    
    // 时间戳
    uint32_t timestamp;        // 系统时间戳
} nav_gpfpd_data_t;

// 导航数据结构体 - IMU原始数据
typedef struct {
    int frame_count;           // 帧计数
    float gyro_x_raw;          // X轴陀螺原始数据，单位：°/S
    float gyro_y_raw;          // Y轴陀螺原始数据，单位：°/S
    float gyro_z_raw;          // Z轴陀螺原始数据，单位：°/S
    float accel_x_raw;         // X轴加速度计原始数据，单位：g
    float accel_y_raw;         // Y轴加速度计原始数据，单位：g
    float accel_z_raw;         // Z轴加速度计原始数据，单位：g
    float temperature;         // IMU温度，单位：度
    int imu_count;             // IMU计数
    int imu_flag;              // IMU标志
    float gyro_x_cal;          // X轴陀螺标定数据，单位：°/S
    float gyro_y_cal;          // Y轴陀螺标定数据，单位：°/S
    float gyro_z_cal;          // Z轴陀螺标定数据，单位：°/S
    float accel_x_cal;         // X轴加速度计标定数据，单位：g
    float accel_y_cal;         // Y轴加速度计标定数据，单位：g
    float accel_z_cal;         // Z轴加速度计标定数据，单位：g
    int pps_count;             // 秒脉冲计数
    int pps_time;              // 秒脉冲时间，单位：ms
    int pps_update_flag;       // 秒脉冲更新标志
    float barometer;           // 气压计，单位：hPa
    int baro_update_flag;      // 气压计更新标志
    
    // 时间戳
    uint32_t timestamp;        // 系统时间戳
} nav_imu_data_t;

// 全局变量声明
extern nav_rmc_data_t g_nav_rmc_data;
extern nav_gga_data_t g_nav_gga_data;
extern nav_vtg_data_t g_nav_vtg_data;
extern nav_inspvaxa_data_t g_nav_inspvaxa_data;
extern nav_gpfpd_data_t g_nav_gpfpd_data;
extern nav_imu_data_t g_nav_imu_data;
extern pthread_mutex_t g_nav_data_mutex;

// 线程8函数声明
void *thread8_function(void *arg);

// 停止线程8运行
void thread8_stop(void);

// 导航串口初始化函数
int nav_rs232_init(const char *device, int baudrate);

// 获取RMC数据函数 (推荐最小定位信息)
// 返回值: 0-成功，-1-失败
int get_nav_rmc_data(nav_rmc_data_t *data);

// 获取GGA数据函数 (全球定位系统定位数据)
// 返回值: 0-成功，-1-失败
int get_nav_gga_data(nav_gga_data_t *data);

// 获取VTG数据函数 (地面速度信息)
// 返回值: 0-成功，-1-失败
int get_nav_vtg_data(nav_vtg_data_t *data);

// 获取INSPVAXA数据函数 (组合导航解算数据)
// 返回值: 0-成功，-1-失败
int get_nav_inspvaxa_data(nav_inspvaxa_data_t *data);

// 获取GPFPD数据函数 (惯导数据)
// 返回值: 0-成功，-1-失败
int get_nav_gpfpd_data(nav_gpfpd_data_t *data);

// 获取IMU原始数据函数
// 返回值: 0-成功，-1-失败
int get_nav_imu_data(nav_imu_data_t *data);

// 串口关闭函数
void nav_rs232_close(int fd);

// 设置导航报文输出频率
// 返回值: 0-成功，-1-失败
int set_nav_output_rate(int fd, const char *msg_type, float rate);

// CRC32校验函数
unsigned long calculate_crc32(unsigned long count, unsigned char *buffer);

#endif /* THREAD8_H */ 